package com.meida.module.bus.provider.service;

import com.meida.common.base.entity.EntityMap;
import com.meida.common.mybatis.base.service.IBaseService;
import com.meida.common.mybatis.model.ResultBody;
import com.meida.module.bus.client.entity.BusOrder;
import com.meida.module.bus.client.entity.BusOrderAnswer;
import com.meida.msg.client.entity.MsgReceive;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 订单表 接口
 *
 * @author flyme
 * @date 2021-08-03
 */
public interface BusOrderService extends IBaseService<BusOrder> {

    /**
     * 确认订单(拍照提问,预约辅导,作业无忧)
     *
     * @param orderId
     * @param couponUserId
     * @param rewardAmount
     * @param answerId
     * @return
     */
    ResultBody getWaitConfirmedInfo(Long orderId, Long couponUserId, Long answerId, BigDecimal rewardAmount);


    /**
     * 订单支付回调
     *
     * @param outTradeNo
     * @param couponUserId
     * @param answerId
     * @return
     */
    ResultBody orderPaySuccess(String outTradeNo, String payType, Long couponUserId, Long answerId,BigDecimal payableAmount,BigDecimal discountAmount);

    /**
     * 统计某学霸已完成订单数量
     *
     * @param answerUserId
     * @return
     */
    Long countFinshOrderNum(Long answerUserId);

    /**
     * 统计某学霸被多少人下单
     *
     * @param answerUserId
     * @return
     */
    Integer countAllUserOrderNum(Long answerUserId);

    /**
     * 统计某学霸(重复下单的人数)
     *
     * @param answerUserId
     * @return
     */
    Integer countAgainUserOrderNum(Long answerUserId);

    /**
     * 订单状态转中文方法(展示给用户)
     *
     * @param orderType
     * @param orderState
     * @return
     */
    Map getOrderStateDesc(Integer orderType, String orderState);

    /**
     * 订单状态转中文方法(展示给用户按钮,按钮名称)
     *
     * @param orderType
     * @param orderState
     * @return
     */
    EntityMap convertOrderState(Long orderId, Integer orderType, String orderState);

    /**
     * 订单状态转中文方法(展示给学霸)
     *
     * @param orderType
     * @param orderState
     * @return
     */
    Map getOrderStateDesc1(Long orderId, Integer orderType, String orderState, Long answerUserId, Integer answerState);

    /**
     * 订单类型转中文方法
     *
     * @param orderType
     * @return
     */
    String getOrderTypeDesc(Integer orderType);

    /**
     * 领取题目(拍照提问)
     *
     * @param orderId
     * @return
     */
    ResultBody receiveOrderQuestion(Long orderId);

    /**
     * 出价列表
     *
     * @param orderId
     * @return
     */
    ResultBody offerPriceList(Long orderId);

    /**
     * 作业无忧(订单出价)
     *
     * @param busOrderAnswer
     * @return
     */
    ResultBody updateOfferPrice(BusOrderAnswer busOrderAnswer);

    /**
     * 接受预约
     *
     * @param params
     * @return
     */
    ResultBody acceptAppointment(Map params);


    /**
     * 拍照提问追问
     *
     * @param params
     * @return
     */
    ResultBody askQuestion(Map params);

    /**
     * 订单退款详情
     *
     * @param params
     * @return
     */
    ResultBody getAfterService(Map params);

    /**
     * 订单评价
     *
     * @param params
     * @return
     */
    ResultBody getOrderAppraise(Map params);

    /**
     * 作业无忧订单还价
     *
     * @param params
     * @return
     */
    ResultBody updateBargainPrice(Map params);


    /**
     * 统计学霸接单数量
     *
     * @param answerUserId
     * @return
     */
    Long totalReceiveOrderNum(Long answerUserId);

    /**
     * 拒绝订单
     *
     * @param orderId
     * @return
     */
    ResultBody refuseOrder(Long orderId);

    /**
     * 更新订单状态为解答中/上课中
     *
     * @param orderId
     * @return
     */
    ResultBody answerIng(Long orderId);

    /**
     * 订单假删(逻辑删除)
     *
     * @param orderId
     * @return
     */
    ResultBody deleteById(Long orderId);

    /**
     * 拒接接单
     */
    ResultBody refuseAnswer(Long orderId);


    /**
     * 关闭直播
     */
    ResultBody closeLive(Long orderId, Long answerId);

    /**
     * 接受答案
     *
     * @param answerId
     * @return
     */
    ResultBody acceptAnswer(Long answerId);

    /**
     * 更新订单状态
     *
     * @param orderId
     * @param orderState
     * @return
     */
    boolean updateOrderState(Long orderId, String orderState);

    /**
     * 更新订单支付状态
     *
     * @param orderId
     * @param payState
     * @return
     */
    boolean updatePayState(Long orderId, Integer payState);

    /**
     * 获取订单答案Id
     *
     * @param orderId
     * @return
     */
    ResultBody getOrderAnswerId(Long orderId);

    /**
     * 根据订单号查找订单号
     *
     * @param outTradeNo
     * @return
     */
    BusOrder findByOrderNo(String outTradeNo);

    /**
     * 统计某学霸解答中的数量
     *
     * @param answerUserId
     * @return
     */
    Long countAnswerIngNum(Long answerUserId);


    /**
     * 获取灵动课堂信息
     *
     * @param orderId
     * @return
     */
    ResultBody getEnterClassRoomInfo(Long orderId);

    /**
     * 订单消息极光推送
     *
     * @param msgReceive
     * @param msgTitle   标题
     * @param msgContent 内容
     */
    void orderPushMessage(MsgReceive msgReceive, String msgTitle, String msgContent);

    /**
     * 合计相应支付状态的支付金额
     *
     * @param payState
     * @return
     */
    BigDecimal sumPayableAmountByPayState(Integer payState);

    /**
     * 合计相应支付状态的订单金额
     *
     * @param payState
     * @return
     */
    BigDecimal sumOrderAmountByPayState(Integer payState);

    /**
     * 合计相应支付状态的订单金额
     *
     * @param payState
     * @param dateType 1日,2月,3年
     * @return
     */
    BigDecimal sumOrderAmountByPayState(Integer payState, Integer dateType, String date);


    /**
     * 合计用户佣金(已完成订单)
     *
     * @param userId
     * @return
     */
    BigDecimal sumUserCommission(Long userId);

    /**
     * sum学霸今日收入
     *
     * @param userId
     * @param date
     * @return
     */
    BigDecimal totalTodayCommission(Long userId, String date);

    /**
     * 作业无忧订单超时取消
     *
     * @param busOrder
     * @param title
     * @param cause
     */
    void orderBookingTutoringCancel(BusOrder busOrder,String title,String cause);

    /**
     * 统计进行中订单数量
     * @param userId
     * @return
     */
    Long totalOrder(Long userId);

}